package features.advance.leetcode.string.easy;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 *  剑指 Offer 50. 第一个只出现一次的字符
 *
 *  难度：简单
 *
 * 在字符串 s 中找出第一个只出现一次的字符。如果没有，返回一个单空格。 s 只包含小写字母。
 *
 * 示例:
 *
 * s = "abaccdeff"
 * 返回 "b"
 *
 * s = ""
 * 返回 " "
 *
 * 限制：
 * 0 <= s 的长度 <= 50000
 *
 * @author LIN
 * @date 2021-06-18
 */
public class Offer50 {

    public static void main(String[] args) {
        Solution solution = new Solution() {
            @Override
            public char firstUniqChar(String s) {
                int res = s.length();
                for (char i = 'a' ; i <= 'z' ; i++) {
                    int idx = s.indexOf(i);
                    if (idx != -1 && idx == s.lastIndexOf(i) && idx < res){
                        res = idx;
                    }
                }
                if (res == s.length())
                    return ' ';
                return s.charAt(res);
            }
        };
        String s = "aadadaad";
        char c = solution.firstUniqChar(s);
        System.out.println(c);
    }

    static class Solution {
        /**
         * 循环所有的字符，存到Set里，如果有就从Set里去掉，最后剩下的就是只出现一次的字符
         * @param s
         * @return
         */
        public char firstUniqChar(String s) {
            if(s != null && s.length()>0){
                List<Character> list = new ArrayList<>();
                Set<Character> set = new HashSet<>();
                for (int i = 0; i < s.length(); i++) {
                    char c = s.charAt(i);
                    if(set.contains(c)){
                        set.remove(c);
                        list.add(c);
                    }else if(!list.contains(c)){
                        set.add(c);
                    }
                }
                System.out.println(set);
                if(!set.isEmpty()){
                    return set.iterator().next();
                }
            }
            return ' ';
        }
    }

}
